package org.itstack.state.order;

/**
 * 订单状态模式演示类
 * 展示订单状态模式的基本用法和状态转换
 * 
 * 状态模式核心思想：
 * 1. 将订单状态封装成独立的类
 * 2. 状态转换由状态类内部控制
 * 3. 上下文类委托操作给当前状态
 * 
 * 适用场景：
 * - 订单状态转换复杂
 * - 不同状态下有不同的操作权限
 * - 需要避免大量的条件判断
 */
public class OrderStatePatternDemo {
    
    /**
     * 演示正常订单流程
     */
    public static void demonstrateNormalOrderFlow() {
        System.out.println("=== 正常订单流程演示 ===");
        
        // 创建订单
        OrderContext order = new OrderContext("ORD-001", "CUST-001", 299.99);
        System.out.println("订单创建：" + order.getOrderSummary());
        
        // 支付
        System.out.println("\n--- 用户支付 ---");
        order.handleAction(OrderAction.PAY);
        System.out.println("当前状态：" + order.getCurrentState());
        
        // 发货
        System.out.println("\n--- 商家发货 ---");
        order.handleAction(OrderAction.SHIP);
        System.out.println("当前状态：" + order.getCurrentState());
        
        // 送达
        System.out.println("\n--- 订单送达 ---");
        order.handleAction(OrderAction.DELIVER);
        System.out.println("当前状态：" + order.getCurrentState());
        
        // 完成
        System.out.println("\n--- 用户确认收货 ---");
        order.handleAction(OrderAction.COMPLETE);
        System.out.println("当前状态：" + order.getCurrentState());
        
        // 显示状态历史
        System.out.println("\n--- 状态历史 ---");
        order.getStateHistory().forEach(System.out::println);
    }
    
    /**
     * 演示订单取消流程
     */
    public static void demonstrateOrderCancellation() {
        System.out.println("\n=== 订单取消流程演示 ===");
        
        // 创建订单
        OrderContext order = new OrderContext("ORD-002", "CUST-002", 199.50);
        System.out.println("订单创建：" + order.getOrderSummary());
        
        // 支付
        order.handleAction(OrderAction.PAY);
        System.out.println("支付后状态：" + order.getCurrentState());
        
        // 申请退款
        System.out.println("\n--- 用户申请退款 ---");
        order.handleAction(OrderAction.REFUND);
        System.out.println("退款后状态：" + order.getCurrentState());
        
        // 尝试其他操作
        System.out.println("\n--- 尝试发货（应该失败）---");
        order.handleAction(OrderAction.SHIP);
    }
    
    /**
     * 演示无效操作
     */
    public static void demonstrateInvalidOperations() {
        System.out.println("\n=== 无效操作演示 ===");
        
        // 创建订单
        OrderContext order = new OrderContext("ORD-003", "CUST-003", 99.99);
        System.out.println("订单创建：" + order.getOrderSummary());
        
        // 尝试在待支付状态下发货
        System.out.println("\n--- 尝试在待支付状态下发货 ---");
        order.handleAction(OrderAction.SHIP);
        
        // 尝试在待支付状态下完成
        System.out.println("\n--- 尝试在待支付状态下完成 ---");
        order.handleAction(OrderAction.COMPLETE);
        
        // 支付后尝试取消
        order.handleAction(OrderAction.PAY);
        System.out.println("\n--- 支付后尝试取消 ---");
        order.handleAction(OrderAction.CANCEL);
    }
    
    /**
     * 演示多订单管理
     */
    public static void demonstrateMultipleOrders() {
        System.out.println("\n=== 多订单管理演示 ===");
        
        // 创建多个订单
        OrderContext order1 = new OrderContext("ORD-004", "CUST-004", 150.00);
        OrderContext order2 = new OrderContext("ORD-005", "CUST-005", 250.00);
        OrderContext order3 = new OrderContext("ORD-006", "CUST-006", 350.00);
        
        System.out.println("订单1：" + order1.getOrderSummary());
        System.out.println("订单2：" + order2.getOrderSummary());
        System.out.println("订单3：" + order3.getOrderSummary());
        
        // 不同订单执行不同操作
        System.out.println("\n--- 订单1：正常流程 ---");
        order1.handleAction(OrderAction.PAY);
        order1.handleAction(OrderAction.SHIP);
        
        System.out.println("\n--- 订单2：取消流程 ---");
        order2.handleAction(OrderAction.PAY);
        order2.handleAction(OrderAction.REFUND);
        
        System.out.println("\n--- 订单3：保持待支付 ---");
        // 订单3保持待支付状态
        
        // 显示最终状态
        System.out.println("\n--- 最终状态 ---");
        System.out.println("订单1状态：" + order1.getCurrentState());
        System.out.println("订单2状态：" + order2.getCurrentState());
        System.out.println("订单3状态：" + order3.getCurrentState());
    }

    public static void main(String[] args) {
        demonstrateNormalOrderFlow();
    }
}
